package com.personal.mall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * 1、整合MyBatisPlus
 *      1、导入依赖
 *      2、配置
 *          1)配置数据源
 *              1) 导入数据库驱动
 *              2) 在application.yaml配置数据源相关信息
 *          2)配置MyBatis-Plus
 *              1) 使用@MapperScan扫描dao层的Mapper
 *              2) 告诉MyBatis-Plus sql映射文件的位置
 * 2、使用逻辑删除
 *      1、在配置文件配置逻辑删除的规则(可以省略)
 *          1) logic-delete-field: 1     代表没有删除
 *             logic-not-delete-value: 0     代表已经删除
 *      2、在Mybatis3.1.1版本以前需要配置配置类，这个项目使用的是Mybatis 3.2 因此这一步也可省略
 *      3、在Entity中配置用来表示逻辑删除的字段，用@TbaleLogic来表示
 *
 *
 * 使用JSR303作为参数校验
 *  1、给Bean添加校验注解：jax.validation.constraints，并且定义自己的message提示
 *  2、开启校验功能@Valid
 *      效果：校验错误后会有默认的响应
 *  3、给校验的Bean后紧跟一个BindingResult.就可以得到校验的结果
 *  4、分组校验(帮助我们完成多复杂场景的校验)
 *      1)、@NotBlank(message = "品牌名不能为空",groups = {AddGroup.class,UpdateGroup.class})
 *          给校验注解标注什么情况需要进行校验
 *      2)、@Validated({AddGroup.class})
 *      3)、默认没有指定分组的校验注解@NotBlak，在分组的情况下不生效，只会在@Validated生效；
 *  5、自定义校验
 *      1)、编写一个自定义的校验注解 @ListValue
 *      2)、编写一个自定义的校验器  ListValueConstraintValidator 实现 ConstraintValidator
 *      3)、关联自定义的校验器和自定义的校验注解
             * @Documented
             * @Constraint(validatedBy = {ListValueConstraintValidator.class【可以指定多个不同的自定义校验器，适配不同的校验类型】})
             * @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
             * @Retention(RUNTIME)
 *
 *
 * 统一的异常处理
 * @ControllerAdvice
 *  1)、编写异常处理类，使用@ControllerAdvice
 *  2)、使用@ExceptionHandler标注方法可以处理异常
 */

@EnableFeignClients(basePackages = "com.personal.mall.product.feign")
@MapperScan("com.personal.mall.product.dao")
@SpringBootApplication
@EnableDiscoveryClient //注册进Nacos
public class MallProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(MallProductApplication.class, args);
    }

}
